#1、钩子函数
#1、勾子函数
#把外函数的运行结果传递到内函数中运行
#外函数就是内函数的勾子
# def out_fun(year):
#     def inner_fun(month):
#         print(f'{year}年{month}月')
#     return inner_fun#把内部函数当作外部函数的返回值
# t= out_fun('2025')
# t('2')
#(4,5,6,7)--11(5,6)
#把2025传递给year，函数out_fun的运行结果(运行结果是inner_fun)赋值给t
#函数out_fun运行结束后，它的参数year也不会释放，内函数inner_fun可以继续使用
#t就是inner_fun


#2、装饰器
#装饰器是添加在函数上面，可以让函数使用装饰器的功能，但是函数又不用写装饰器的代码(外挂)
def f1(fun):
    def f2():
        print('前置脚本')
        fun()
        print('后置脚本')
    return f2

def f3(fun):
    def f4():
        print('前前置脚本')
        fun()
        print('后后置脚本')
    return f4

@f3
@f1
def csyl():     #函数f1是函数csyl的装饰器，csyl具备f1的功能，但是它不需要写f1的代码
    print('执行测试用例')
csyl()

#3、classmethod 装饰器
#可以装饰在方法上，让这个方法可以不用实例化直接调用
# class C:
#     @classmethod
#     def f1(self):
#         print('我是f1')
#     @classmethod
#     def f2(self):
#         print('我是f2')
# c1=C()
# c1.f1()#类中方法必须先实例化，然后利用对象去调用方法
# c1.f2()
# C.f1()#直接调用类方法会报错，加上classmethod装饰器,它就可以直接调用
# C.f2()